package com.bytecamp.testplatform.controller;

import com.bytecamp.testplatform.model.ApiInfo;
import com.bytecamp.testplatform.service.ApiInfoService;
import com.bytecamp.testplatform.util.OpenApiParserUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.List;

/**
 * 接口文档管理控制器（适配 Spring Boot 3.x）
 */
@RestController
@RequestMapping("/api/docs")
@Tag(name = "接口文档管理", description = "处理接口文档上传、解析、查询")  // springdoc 标签注解
@RequiredArgsConstructor
public class ApiInfoController {

    private final ApiInfoService apiInfoService;

    @PostMapping("/upload")
    @Operation(summary = "上传接口文档", description = "支持 Swagger/OpenAPI 格式的 JSON/YAML 文件")
    public String uploadDoc(@RequestParam("file") MultipartFile file) {
        try {
            // 1. 定义临时文件保存路径（使用系统临时目录，避免路径依赖）
            String tempDir = System.getProperty("java.io.tmpdir") + "api-docs-temp/"; // 系统临时目录下的子文件夹
            File dir = new File(tempDir);
            // 自动创建目录（如果不存在）
            if (!dir.exists()) {
                dir.mkdirs(); // 关键：创建多级目录
            }

            // 2. 生成临时文件名（避免重复）
            String originalFileName = file.getOriginalFilename();
            String tempFileName = System.currentTimeMillis() + "_" + originalFileName; // 加时间戳防止重名
            String tempPath = tempDir + tempFileName;

            // 3. 保存文件到临时路径
            File tempFile = new File(tempPath);
            file.transferTo(tempFile); // 此时目录已存在，不会报错

            // 4. 解析接口文档
            List<ApiInfo> apiInfoList = OpenApiParserUtil.parseAllApis(tempPath);

            // 5. 批量保存到数据库
            boolean success = apiInfoService.batchSaveApiInfo(apiInfoList);

            // 6. 清理临时文件（可选，避免占用空间）
            tempFile.delete();

            return success ? "文档上传并解析成功，共提取" + apiInfoList.size() + "个接口" : "部分接口已存在，上传失败";
        } catch (Exception e) {
            return "上传失败：" + e.getMessage();
        }
    }


    /* 未解析yaml的假数据
    @PostMapping("/upload")
    @Operation(summary = "上传接口文档", description = "支持 Swagger/OpenAPI 格式的 JSON/YAML 文件")
    public String uploadDoc(@RequestParam("file") MultipartFile file) {
        // 业务逻辑不变（实际开发中需替换为真实解析逻辑）
        try {
            ApiInfo mockApi = new ApiInfo();
            mockApi.setServiceName("用户服务");
            mockApi.setPath("/user/login");
            mockApi.setMethod("POST");
            mockApi.setDescription("用户登录接口");
            mockApi.setRequestParams("[{\"name\":\"username\",\"type\":\"String\",\"required\":true}]");
            mockApi.setResponseSchema("{\"code\":200,\"data\":{\"token\":\"xxx\"}}");

            boolean success = apiInfoService.saveApiInfo(mockApi);
            return success ? "文档上传并解析成功" : "接口已存在，上传失败";
        } catch (Exception e) {
            return "上传失败：" + e.getMessage();
        }
    }
     */

    @GetMapping("/list")
    @Operation(summary = "查询所有接口", description = "返回系统中已解析的所有接口信息")
    public List<ApiInfo> getApiList() {
        return apiInfoService.getAllApis();
    }

}